package cn.shiwei.hr.exception;

import cn.shiwei.hr.constants.ErroeCode;
import cn.shiwei.hr.repository.AjaxResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

// @Import({GlobalException.class}) 对应调用方的启动类会默认去找同包和子包, 找不到可以在那个启动类上加上这个注解

@RestControllerAdvice // @RestController注解的增强, 在这个类中方法可以在其他的controller 执行前后, 被执行(类比拦截器和aop)
public class GlobalExceptionHandle  {
    // 异常处理的注解(这个注解会被捕获指定的异常)
    @ExceptionHandler(GlobalException.class)
    private AjaxResult globalExceptionHandle(GlobalException e){
        e.printStackTrace();
        return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
    }

    // 异常处理的注解(这个注解会被捕获指定的异常)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    private AjaxResult verifyExceptionHandle(MethodArgumentNotValidException e){
        e.printStackTrace();
        StringBuilder sb = new StringBuilder();
        // 拼接多个校验异常信息
        e.getBindingResult().getAllErrors().forEach(error -> {
            sb.append(error.getDefaultMessage()).append("\t");
        });
        return AjaxResult.me().setSuccess(false).setMessage(sb.toString());
    }

    // 异常处理的注解
    @ExceptionHandler(Exception.class)
    private AjaxResult exceptionHandle(Exception e){
        e.printStackTrace();
        return AjaxResult.me().setSuccess(false).setMessage(ErroeCode.SYSTEM_EXCEPTION.toString());
    }
}
